<?php
namespace app\admin\controller;

use app\common\BaseAdminController;
use app\common\Result;
use app\model\Admin;
use think\facade\Db;

class Index extends BaseAdminController
{
    public function index($pageNum = 1, $pageSize = 10, $username = null)
    {

        // 初始化查询构建器
        $query = Admin::with(['store', 'role'])
            ->order('id', 'desc')
            ->page($pageNum, $pageSize);

        // 如果传入了 username 参数，则添加 where 条件
        if ($username) {
            $query->where('username', $username);
        }

        // 关联查询出管理员关联的店铺和角色信息
        $list = $query->select();
        // 获取总记录数
        $total = $query->count();
        // 返回包含查询结果和总记录数的 JSON 数据
        return Result::success(['list' => $list, 'total' => $total], '查询成功');
    }

    /**
     * 向数据库中添加管理员信息的方法
     *
     * 该方法接收前端传来的表单数据，使用验证器对数据进行校验，
     * 若校验通过则将数据插入到 'admin' 表中，并返回相应的结果。
     *
     * @return \think\response\Json 返回包含操作结果的 JSON 数据
     */
    public function add()
    {
        // 接收前端通过 POST 方法提交的数据
        $data = $this->request->post();
        // 实例化管理员验证器对象，用于对接收的数据进行校验
        $validate = new \app\validate\Admin();
        // 调用验证器的 check 方法对数据进行校验，若校验不通过
        if (! $validate->check($data)) {
            // 返回包含错误信息的 JSON 数据，状态码为 400
            return Result::error($validate->getError());
        }
        // 查询数据库中是否存在该管理员
        $result = Db::table('admin')->where('username', $data['username'])->find();
        // 判断查询结果是否为空
        if (! empty($result)) {
            // 若查询结果不为空，返回包含错误信息的 JSON 数据，状态码为 400
            return Result::error('该管理员已存在');
        }
        // 对密码进行加密处理
        $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
        // 将经过校验的数据插入到 'admin' 数据库表中，并获取插入操作的结果
        $result = Db::table('admin')->insert($data);

        // 判断插入操作是否成功
        if ($result) {
            // 若插入成功，返回包含成功信息的 JSON 数据，状态码为 200
            return Result::success(null, '添加成功');
        }

        // 若插入失败，返回包含错误信息的 JSON 数据，状态码为 400
        return Result::error('添加失败');
    }

    public function update()
    {
        // 接收前端通过 POST 方法提交的数据
        $data = $this->request->post();
        // 实例化管理员验证器对象，用于对接收的数据进行校验
        $validate = new \app\validate\AdminUpdate();
        // 调用验证器的 check 方法对数据进行校验，若校验不通过
        if (! $validate->check($data)) {
            // 返回包含错误信息的 JSON 数据，状态码为 400
            return Result::error($validate->getError());
        }

        if (isset($data['password'])) {
            // 对密码进行加密处理
            $data['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
        }

        // 查询数据库中是否存在该管理员
        $result = Db::table('admin')->where('id', $data['id'])->find();

        // 判断查询结果是否为空
        if (empty($result)) {
            // 若查询结果为空，返回包含错误信息的 JSON 数据，状态码为 400
            return Result::error('该管理员不存在');
        }

        if (isset($data['store_id'])) {
            // 查询店铺
            $store = Db::table('store')->where('id', $data['store_id'])->find();
            // 判断查询结果是否为空
            if (empty($store)) {
                // 若查询结果为空，返回包含错误信息的 JSON 数据，状态码为 400
                return Result::error('该店铺不存在');
            }
        }

        // 将经过校验的数据插入到 'admin' 数据库表中，并获取插入操作的结果
        $result = Db::table('admin')->update($data);

        // 判断插入操作是否成功
        if ($result) {
            // 若插入成功，返回包含成功信息的 JSON 数据，状态码为 200
            return Result::success(null, '修改成功');
        }

        // 若插入失败，返回包含错误信息的 JSON 数据，状态码为 400
        return Result::error('修改失败');
    }

    public function delete()
    {
        // 接收前端通过 POST 方法提交的数据
        $aid = $this->request->post("aid");
        // 查询数据库中是否存在该管理员
        $result = Db::table('admin')->where('id', $aid)->find();
        // 判断查询结果是否为空
        if (empty($result)) {
            // 若查询结果为空，返回包含错误信息的 JSON 数据，状态码为 400
            return Result::error('该管理员不存在');
        }
        // 若查询结果不为空，执行删除操作
        $result = Db::table('admin')->where('id', $aid)->delete();

        // 判断删除操作是否成功
        if ($result) {
            // 若删除成功，返回包含成功信息的 JSON 数据，状态码为 200
            return Result::success(null, '删除成功');
        }

        // 若删除失败，返回包含错误信息的 JSON 数据，状态码为 400
        return Result::error('删除失败');
    }

    public function permission()
    {
        // 从token接收id
        $uid = $this->request->uid;

        // 使用模型查询
        $admin = \app\model\Admin::with(['role.permissions'])
            ->where('id', $uid)
            ->find();

        if (empty($admin)) {
            return Result::error('该管理员不存在');
        }

        return Result::success([
            'admin'       => $admin,
            'role'        => $admin->role,
            'permissions' => $admin->role->permissions,
        ], '查询成功');
    }

    public function bindRole()
    {
        // 从token接收id
        $uid = $this->request->uid;
        // 接收前端通过 POST 方法提交的数据
        $rid = $this->request->post("rid");
        // 实例化管理员模型对象
        $admin = Admin::with('role')->find($uid);
        // 调用模型的 bindRole 方法，将管理员与角色进行绑定
        $admin->bindRole($rid);
        return json(['code' => 200, 'msg' => '绑定成功']);
    }
}
